/*
* Manages saving state to a local SharedObject.
* The states saved are the current tab, pod order, minimized pods,
* maximized pods and if applicable the ViewStack index of pod content.
*/

package com.dashboard.managers
{
	import com.dashboard.dto.Personalization;
	import com.dashboard.events.LayoutChangeEvent;
	import com.dashboard.view.Pod;
	import flash.net.SharedObject;
	import mx.core.Application;
	
	public class StateManager  
	{
		// Contains a viewIndex property for managing the tabs and an object for each view keyed by a viewId String.
		private static var sharedObject:SharedObject = SharedObject.getLocal("com.dashboard");
		private static const VIEW_INDEX:String = "viewIndex";				// Number in sharedObject.
		private static const ITEMS:String = "items";						// Array in view object.
		private static const MINIMIZED_ITEMS:String = "minimizedItems";		// Array in view object.
		private static const MAXIMIZED_ITEM:String = "maximizedItem";		// String in view object.
		private static const POD_VIEW_INDEXES:String = "podViewIndexes";	// Object in view object.
		
		// Saves the index of a viewStack within a pod.
		public static function setPodViewIndex(viewId:String, podId:String, index:Number):void
		{
			var o:Object = getViewIdObject(viewId);
			if (o[POD_VIEW_INDEXES] == null)
				o[POD_VIEW_INDEXES] = new Object();
			o[POD_VIEW_INDEXES][podId] = index;
			
			sharedObject.flush();
		}
		
		// Returns the index of a viewStack within a pod.
		public static function getPodViewIndex(viewId:String, podId:String):Number
		{
			var o:Object = getViewIdObject(viewId);
			var podViewIndexes:Object = o[POD_VIEW_INDEXES];
			if (podViewIndexes != null)
				return podViewIndexes[podId] == null ? -1 : podViewIndexes[podId];
			else		
				return -1;
		}
		
		// Saves the TabBar index in the main app view.
		public static function setViewIndex(n:Number):void
		{
			sharedObject.data[VIEW_INDEX] = n;
			sharedObject.flush();
		}
		
		// Returns the TabBar index in the main app view.
		public static function getViewIndex():Number
		{
			return isNaN(sharedObject.data[VIEW_INDEX]) ? 0 : sharedObject.data[VIEW_INDEX];
		}
		
		// Handles layout updates.
		public static function setPodLayout(e:LayoutChangeEvent):void
		{
			var manager:PodLayoutManager = PodLayoutManager(e.currentTarget);
			var o:Object = getViewIdObject(manager.id);
			o[MAXIMIZED_ITEM] = manager.maximizedPod != null ? manager.maximizedPod.id : null;
			o[MINIMIZED_ITEMS] = podArrayToStringArray(manager.minimizedItems);
			o[ITEMS] = podArrayToStringArray(manager.items);
			sharedObject.flush();
			//Chimera : Personalization
			/* UpdatePersonalization(manager); */
		 	var temp:String = Application.application.ObjConfigaration.isPersonalized;
			if(temp.toLowerCase() == "true")
				Personalization.UpdatePersonalization();
		}
	
		private function FillWidgetContent(storeXml:XML, pod:Pod):void
		{
	
		} 
		
		// Gets the id of each pod and puts it into an array.
		private static function podArrayToStringArray(podArray:Array):Array
		{
			var len:Number = podArray.length;
			var a:Array = new Array();
			for (var i:Number = 0; i < len; i++)
			{
				a.push(Pod(podArray[i]).id);
			}
			
			return a;
		}
		
		// Gets the saved layout index of a pod.
		public static function getPodIndex(viewId:String, itemId:String):Number
		{
			var o:Object = getViewIdObject(viewId);
			var a:Array = o[ITEMS];
			if (a != null)
			{
				var len:Number = a.length;
				for (var i:Number = 0; i < len; i++)
				{
					if (a[i] == itemId)
					return i;
				}
			}
			
			return -1;
		}
		
		// Gets the minimized layout index of a pod.
		public static function getMinimizedPodIndex(viewId:String, itemId:String):Number
		{
			var o:Object = getViewIdObject(viewId);
			var a:Array = o[MINIMIZED_ITEMS];
			if (a != null)
			{
				var len:Number = a.length;
				for (var i:Number = 0; i < len; i++)
				{
					if (a[i] == itemId)
					return i;
				}
			}
			
			return -1;
		}
		
		// Determines if the pod was maximized. There can only be one maximized pod per view.
		public static function isPodMaximized(viewId:String, itemId:String):Boolean
		{
			var o:Object = getViewIdObject(viewId);
			return o[MAXIMIZED_ITEM] == itemId;
		}
		
		// Determines if the pod was minimized.
		public static function isPodMinimized(viewId:String, itemId:String):Boolean
		{
			var o:Object = getViewIdObject(viewId);
			var a:Array = o[MINIMIZED_ITEMS];
			if (a != null)
			{
				var len:Number = a.length;
				for (var i:Number = 0; i < len; i++)
				{
					if (a[i] == itemId)
					return true;
				}
			}
			return false;
		}
		
		// Get the view object from sharedObject.
		private static function getViewIdObject(viewId:String):Object
		{
			if (sharedObject.data[viewId] == null)
				sharedObject.data[viewId] = new Object();
				
			return sharedObject.data[viewId];
		}
	}
}